/*
  Projeto:    CNC Fag - Engenharia Mecânica e Controle e Automação
  Descritivo: Programa para acionamento dos motores de passo
  
  Formatação conforme "NASA-GSFC_C_Programming_Styles-94-003" em anexo
  
  Autor                   ID    Data        Rev.  e-mail 
  Nilson Custódio Junior  NCJ   29/10/2012  A     nilson@nilson.eng.br 
*/

/*
 Definição de Saídas
*/
const int s1H = 1 ; // Saída Bobina 1 High
const int s1L = 1 ; // Saída Bobina 1 Low
const int s2H = 1 ; // Saída Bobina 2 High
const int s2L = 1 ; // Saída Bobina 2 Low

/*
 Definição de Constantes
*/
#define Horario      0
#define AntiHorario  1

#define MODO1      0
#define MODO2      1
#define MODO3      2

/*
 Declaração de Variaveis
*/

  /* 
   Tabelas
  */
  unsigned char modo1 [8] = {8,12,4,6,2,3,1,9};
  unsigned char modo2 [4] = {8,4,2,1};
  unsigned char modo3 [4] = {12,6,3,9};
  /* 
   Variaveis
  */
  unsigned char *mode ;
  unsigned char vetor = 0 ;
  unsigned char tamanho = 0 ;
  unsigned char valor ;
  /*
   Comandos
  */
  unsigned char dir    = Horario ;
  unsigned char noModo = MODO1 ; // Ver figuras em anexo (Modo1.jpg Modo2.jpg Modo3.jpg)
  unsigned int  tempo  = 100 ; // Tempo em Milisegundos. Diminuir para aumentar Velocidade
 

/****************************************************
* Rotina: setup()
* Descrição: Inicialização do programa
* Argumentos: void
* Retorna: void
****************************************************/
void setup() {
  Serial.begin(9600);
  pinMode(s1H, OUTPUT);
  pinMode(s1L, OUTPUT);
  pinMode(s2H, OUTPUT);
  pinMode(s2L, OUTPUT);
}
/****************************************************
* Rotina: loop()
* Descrição: loop princiapl
* Argumentos: void
* Retorna: void
****************************************************/
void loop() {
  
  /*
     Modo Selecionado  
  */
  switch (noModo)
  {
    case 0:
      mode = &modo1[0] ;
      tamanho = 8 ;    
      break;
    case 1:
      mode = &modo2[0] ;
      tamanho = 4 ;    
      break;
    default:
      mode = &modo3[0] ;
      tamanho = 4 ;
  }
  /*
     Direção do Motor   
  */
   if (dir)
  {
    if ((++ valor)>tamanho)
      valor = 0 ;
  } else
  {
    if ((-- valor)==0xFF)
      valor = tamanho - 1 ;
  }
  /*
     Direção  
  */
  update_saidas ( mode[valor] ); 
  delay ( tempo );  
}
/****************************************************
* Rotina: update_saidas()
* Descrição: atualiza saídas para os transistor
* Argumentos: valor das portas
* Retorna: void
****************************************************/
void update_saidas ( unsigned char value )
{
  digitalWrite(s1H, value&0x01);
  digitalWrite(s1L, value&0x02);
  digitalWrite(s2H, value&0x04);
  digitalWrite(s2L, value&0x08);
}
